/**
 * 下载文件工具函数
 */

/**
 * 下载文件
 * @param response - 响应对象或Blob数据
 * @param filename - 文件名
 */
export const downloadFile = (response: any, filename: string) => {
  let blob: Blob
  
  if (response instanceof Blob) {
    blob = response
  } else if (response.data instanceof Blob) {
    blob = response.data
  } else {
    // 如果是其他格式，尝试转换为Blob
    blob = new Blob([response.data || response], {
      type: 'application/octet-stream'
    })
  }
  
  // 创建下载链接
  const url = window.URL.createObjectURL(blob)
  const link = document.createElement('a')
  link.href = url
  link.download = filename
  
  // 触发下载
  document.body.appendChild(link)
  link.click()
  
  // 清理
  document.body.removeChild(link)
  window.URL.revokeObjectURL(url)
}

/**
 * 下载文本内容为文件
 * @param content - 文本内容
 * @param filename - 文件名
 * @param mimeType - MIME类型
 */
export const downloadText = (content: string, filename: string, mimeType = 'text/plain') => {
  const blob = new Blob([content], { type: mimeType })
  downloadFile(blob, filename)
}

/**
 * 下载JSON数据为文件
 * @param data - JSON数据
 * @param filename - 文件名
 */
export const downloadJson = (data: any, filename: string) => {
  const content = JSON.stringify(data, null, 2)
  downloadText(content, filename, 'application/json')
}

/**
 * 从URL下载文件
 * @param url - 文件URL
 * @param filename - 文件名
 */
export const downloadFromUrl = async (url: string, filename: string) => {
  try {
    const response = await fetch(url)
    const blob = await response.blob()
    downloadFile(blob, filename)
  } catch (error) {
    console.error('下载文件失败:', error)
    throw error
  }
}